<?php
/**
 * Model和View结合对象
 * 
 * 如果一个controller某个方法返回该对象，则其对应的view将会触发同样的方法
 * <br/><br/>
 * 一个示例controller中的方法
 * <code>
 * 	public function appAdd() {
 * 		$model = new IModelAdapter();
 * 		$model->addObject("age", 20);
 * 		$model->addObject("height", 178);
 * 		$model->addObject("compony", "wangyou.com");
 * 		$model->addObject("number", IndexHelper::add($this->in->i, $this->in->j));	
 * 		return new IModelAndView($model, "IndexView");
 * 	}
 * 	</code>
 * 		
 * 	一个示例view(类名称为IndexView)中的方法
 * 	<code>
 * 	public function appAdd($model) {
 * 			echo "age:" . $model->getObject("age") . "<br/>" .
 * 					"height:" . $model->getObject("height") . "<br/>" .
 * 					"compony:" . $model->getObject("compony") . "<br/>" . 
 * 					"number:" . $model->getObject("number");
 * 	}
 * 	</code>
 *
 * @version $Id: IModelAndView.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.mvc
 */
class IModelAndView extends IAbstractViewScheme {
	private $model;
	private $view;
	private $invokingMethodName;
	
	/**
	 * 构造方法
	 *
	 * @param mixed $model 数据
	 * @param string $view view类名称
	 */
	public function __construct($model, $view) {
		$this->model = $model;
		if (!is_object($view)) {
			$this->view = IObjectFactory::getSingleObject($view);
		}
		else {
			$this->view = $view;
		}
	}
	
	/**
	 * 取得该对象中的数据
	 *
	 * @return mixed
	 */
	public function &getModel() {
		return $this->model;
	}
	
	/**
	 * 取得该对象中的IView
	 *
	 * @return IView
	 */
	public function getView() {
		return $this->view;
	}
	
	/**
	 * 设置调用的方法
	 *
	 * @param string $methodName 方法名
	 */ 
	public function setInvokingMethod($methodName) {
		$this->invokingMethodName = $methodName;
	}
	
	/**
	 * 调用/执行
	 *
	 */
	public function invoke() {
		$viewObject = $this->getView();
		if (!method_exists($viewObject, $this->invokingMethodName)) {
			ILogger::fatal("method '" . get_class($viewObject) . "::" . $this->invokingMethodName . "' does't exists");
		}
		else {
			$method = $this->invokingMethodName;
			$viewObject->$method($this->getModel());
		}
	}
	
	/**
	 * 添加键值对
	 *
	 * @param mixed $key 键
	 * @param mixed $value 值
	 * @since 0.1
	 */
	public function put($key, $value) {
		$model = &$this->getModel();
		if (is_object($model)) {
			IReflection::setProperty($model, $key, $value);
		}
		else if (is_array($model)) {
			$model[$key] = $value;
		}
		else if ($model instanceof IModel) {
			$model->addObject($key, $value);
		}
	}
}

?>